//
//  UserDAL.swift
//  weibo1
//
//  Created by 李进 on 15/11/2.
//  Copyright © 2015年 李进. All rights reserved.
//

import Foundation

private let maxCacheDateTime: NSTimeInterval = 7 * 24 * 60 * 60
//MARK: 数据访问层 负者处理本地数据  和网络数据
class UserDAL{
    
    //MARK: 假如数据过大就要删除数据这边就实现删除数据库中的数据
    class func clearDataCache(){
        //1.z准备日期
        let data = NSDate(timeIntervalSinceNow: -maxCacheDateTime)
        
        //日期格式
        let df = NSDateFormatter()
        //指定所属地区的时区
        df.locale = NSLocale(localeIdentifier: "en")
        //指定日期格式
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        //获取日期
        let datastr = df.stringFromDate(data)
        //执行sql删除数据
        let sql = "DELETE FROM T_Users WHERE createTime < ?;"
        
        FMDBManager.shareManager.queue.inDatabase { (db) -> Void in
            
            if db.executeUpdate(sql, datastr) {
                print("删除了 \(db.changes()) 条缓存数据")
            }
        }
    }
    
    //MARK:这是总方法 数据库没有就下载有的话就直接加载／下载好了直接保存
    class func loadUser(since_id: Int,max_id: Int, finished: (temparray:[[String: AnyObject]]?) -> ()){
       
        //1.检查本地是否存在数据
    
        let array = checkCacheDate(since_id, max_id: max_id)
        
        //判断数组中是否有值
        //2.如果有就返回数据
        if array?.count > 0 {
            finished(temparray: array)
            return
        }
        //3.如果没有就下载数据
        
        SWWebTools.shareWebTools.loadUserFriend(since_id, max_id: max_id) { (result, error) -> () in
            if error != nil {
                print("出错了")
                
                finished(temparray: nil)
                return
            }
            
            //判断 result 的数据机构是否正确
            guard let array = result?["statuses"] as? [[String: AnyObject]] else{
                finished(temparray: nil)
                return
            }
            
            //将下载好的数据保存到数据库中
            UserDAL.saveDataBySqlite(array)
            //5.返回网络数据
            finished(temparray: array)
        } 
    }
    
    //MARK: 实现查询数据有就直接加载没有的话 就直接下载
    private class func checkCacheDate(since_id: Int,max_id: Int) -> [[String: AnyObject]]?{
        
        // 0. 用户 id
        guard let userId = userAccViewModel.shareAccViewModel.userModel?.uid else {
            print("用户没有登录")
            return nil
        }
        
        var temp = [[String: AnyObject]]()
        //准备sql
        var sql = "SELECT usersId, userFriend, userId FROM T_Users \n"
        
        sql += "WHERE userId = \(userId) \n"
        
        if since_id > 0 {           // 下拉刷新
            sql += "    AND usersId > \(since_id) \n"
        } else if max_id > 0 {      // 上拉刷新
            sql += "    AND usersId < \(max_id) \n"
        }
        
        sql += "ORDER BY usersId DESC LIMIT 20;"
        
        //执行 sql 查询 －》返回结果
        let array = FMDBManager.shareManager.execRecordSet(sql)
        
        //因为存放在数据库中的数据是二进制数据 所以要将他转化成出来
        //遍历数组
        for dic in array {
            //将数据库中的数据便利出来时json数据
            let json = dic["userFriend"] as! NSData
            //将json数据转化成字典
            let result = try! NSJSONSerialization.JSONObjectWithData(json, options: [])
            
            //将便利好的数据存放到数组中
            temp.append(result as! [String: AnyObject])
            
            
        }
        
        return temp
    }
    
    //MARK: 注入数据／保存数据
  private class func saveDataBySqlite(array:[[String : AnyObject]]){
        
        //先判断是否有用户登录
        guard let userId = userAccViewModel.shareAccViewModel.userModel?.uid else{
            print("没有用户登入")
            return
        }
        
        //sql
        let sql = "INSERT OR REPLACE INTO T_Users (usersId, userFriend, userId) VALUES (?, ?, ?);"
        
        FMDBManager.shareManager.queue.inTransaction { (db, rollback) -> Void in
            
            for dic in array {
                //微博id
                let usersId = dic["id"] as! Int
                
                //序列化字典
                let json = try! NSJSONSerialization.dataWithJSONObject(dic, options: [])
                
                //插入数据/加入不成功（断电什么）就会回答开始的时候的状态
                if !db.executeUpdate(sql, usersId, json, userId) {
                    
                    rollback.memory = true
                    
                    break
                }
            }
        }
    }
}